// 1. 使用 this. 简写方式
class Person {
  String name;
  int age;
  String? sex;

  // 简写构造函数
  Person(this.name, this.age, {this.sex});

  void show() {
    print('我是$name,我$age岁了,性别为$sex');
  }

  void eat() {
    print('我吃东西');
  }
}

// 2. 子类构造函数简写 - 方式1：直接传递参数
class Student extends Person {
  String hobby;

  // 简写：直接使用 this.hobby 和 super()
  Student(super.name, super.age, this.hobby, {super.sex});

  @override
  void show() {
    print('我是学生$name,我$age岁了,性别为$sex,喜欢$hobby');
  }

  void happy() {
    print('object1');
  }

  void we() {
    super.show();
    print('object2');
  }
}

// 3. 子类构造函数简写 - 方式2：使用 super. 语法
class GraduateStudent extends Student {
  String major;

  // 简写：使用 super. 语法
  GraduateStudent(super.name, super.age, super.hobby, this.major, {super.sex});

  @override
  void show() {
    print('我是研究生$name,我$age岁了,性别为$sex,喜欢$hobby,专业是$major');
  }

  @override
  void eat() {
    print('我在食堂吃饭');
  }
}

// 4. 更复杂的简写示例
class Employee extends Person {
  String department;
  double salary;

  // 多参数简写
  Employee(super.name, super.age, this.department, this.salary, {super.sex});

  @override
  void show() {
    print('我是员工$name,我$age岁了,性别为$sex,在$department部门工作,薪资$salary');
  }
}

// 5. 带初始化的简写
class Manager extends Employee {
  List<String> subordinates;

  // 简写 + 初始化列表
  Manager(
      super.name, super.age, super.department, super.salary, this.subordinates,
      {super.sex})
      : assert(subordinates.isNotEmpty, '管理者必须有下属');

  @override
  void show() {
    print('我是经理$name,管理${subordinates.length}个下属');
  }
}

void main(List<String> args) {
  print('=== 原始写法 ===');
  Person p = Person('张三', 18);
  p.show();
  p.eat();

  print('\n=== 简写写法 ===');
  Student s = Student('李四', 20, '睡觉');
  s.show();
  s.eat();
  s.happy();
  s.we();

  GraduateStudent gs = GraduateStudent('王五', 25, '编程', '计算机科学');
  gs.show();
  gs.eat();

  Employee emp = Employee('赵六', 30, '技术部', 8000.0);
  emp.show();

  Manager mgr = Manager('钱七', 35, '管理部', 12000.0, ['张三', '李四']);
  mgr.show();
}
